#include "BLUETOOTH.h"                  // Device header



void BlueTooth_Init(void)
{
	/*定义变量*/
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure; 
	NVIC_InitTypeDef NVIC_InitStructure;					//定义结构体变量
	
	/*开启时钟*/ 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);		//开启USART2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	//RX2 A3  浮空输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  //設置輸出速率
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;   //将引脚初始化为浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//TX2 A2  复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  //設置輸出速率
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;   //将引脚初始化为复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/*USART2初始化*/
	USART_InitStructure.USART_BaudRate = 9600;                  //波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长，选择8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;      //停止位，选择1位
	USART_InitStructure.USART_Parity = USART_Parity_No;         //奇偶校验，不需要
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制，不需要
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  //模式，发送模式和接收模式均选择
	USART_Init(USART2, &USART_InitStructure);                   //将结构体变量交给Init，配置USART2
	
	/*中断输出配置*/
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);			//开启串口接收数据的中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);			//配置NVIC为分组2
	
	/*NVIC配置*/
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;		//选择配置NVIC的USART2线
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		//指定NVIC线路的抢占优先级为0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//指定NVIC线路的响应优先级为0, 从优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//指定NVIC线路使能
	NVIC_Init(&NVIC_InitStructure);							//将结构体变量交给NVIC_Init，配置NVIC外设
	
	/*USART使能*/
	USART_Cmd(USART2, ENABLE);								//使能USART2，串口开始运行
}
/**
  * 函    数：发送一个数据(数字/字母)
  * 参    数：char Data
  * 返 回 值：无
  * 注意事项：
  */
void BlueTooth_Send(char Data)
{
	USART_SendData(USART2, Data);
}


int fputc(int ch, FILE *f) {
    // 等待发送数据寄存器为空
    while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);

    // 发送字符
    USART_SendData(USART2, (uint8_t) ch);

    // 等待发送完成
    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

    return ch;
}


/**
  * 函    数：接收一个数据(数字/字母)
  * 参    数：无
  * 返 回 值：USART_ReceiveData(USART2)
  * 注意事项：
  */
char BlueTooth_Read(void)
{
	return USART_ReceiveData(USART2) ;
}


char recv_data = 0;
/**
  * 函    数：USART2中断函数
  * 参    数：无
  * 返 回 值：无
  * 注意事项：此函数为中断函数，无需调用，中断触发后自动执行
  *           函数名为预留的指定名称，可以从启动文件复制
  *           请确保函数名正确，不能有任何差异，否则中断函数将不能进入
  */
void USART2_IRQHandler(void)
{
	if(USART_GetITStatus(USART2, USART_IT_RXNE  ) == SET)
	{
		recv_data = BlueTooth_Read();
		
		USART_ClearITPendingBit(USART2,USART_IT_RXNE ); 
	}
}